{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 从 CSV 文件读取数据  \n",
    "df = pd.read_csv(r\"D:\\clone\\movie_recommendation_app_question\\ratings.csv\")  # 使用 r 前缀处理反斜杠  \n",
    "\n",
    "X =  df[['Movie1', 'Movie2']].values#TODO\n",
    "\n",
    "y = df['Preference'].values#TODO  # 0表示动作片，1表示喜剧片"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier(n_neighbors=1) #TODO"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {color: black;}#sk-container-id-2 pre{padding: 0;}#sk-container-id-2 div.sk-toggleable {background-color: white;}#sk-container-id-2 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-2 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-2 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-2 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-2 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-2 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-2 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-2 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-2 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-2 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-2 div.sk-item {position: relative;z-index: 1;}#sk-container-id-2 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-2 div.sk-item::before, #sk-container-id-2 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-2 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-2 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-2 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-2 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-2 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-2 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-2 div.sk-label-container {text-align: center;}#sk-container-id-2 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-2 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=1)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier(n_neighbors=1)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=1)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y) # TODO"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_user = np.array([[3, 4]])\n",
    "prediction =  knn.predict(new_user) #TODO"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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56NPnz7l9i0oKEBBQYHidU5ODgCgqKgIRUVF2glermw8bY9bWxh7foDx58j8DJ+x58j8DJ+ucqyp90wSQogaOVI5zp49Cz8/P+Tn58PW1hZRUVEIDAxU2zc5ORnx8fHo3LkzCgoK8P3332Pt2rWIjY1Fz5491e6zcOFCLFq0SKU9KioKNjY2Ws2FiIiIdOPhw4cYOXIksrOzlZbTaJveC6PCwkKkpaXh3r17iI6OxnfffYe4uDi0adOmUvsPHjwYkiRh165darerO2Pk4eGBW7duaf2NLSoqwsGDB+Hv7w9zc3Otjl0bGHt+gPHnyPwMn7HnyPwMn65yzMnJQf369XVeGOn9UpqFhYVi8bWvry9OnDiBlStXYt26dZXav2vXrti0aVO52y0tLWFpaanSbm5urrMPpS7Hrg2MPT/A+HNkfobP2HNkfoZP2znW1PtV655jJIRQOsPzJKdPn4arq6sOIyIiIqKnhV7PGM2bNw8DBw6Eh4cH7t+/j61btyI2Nhb79u0DAMydOxfp6enYuHEjAGDFihXw9PRE27ZtUVhYiE2bNiE6OhrR0dH6TIOIiIiMhF4Loxs3bmDUqFHIyMiAg4MDfHx8sG/fPvj7+wMAMjIykJaWpuhfWFiI2bNnIz09HdbW1mjbti327NlT7mJtIiIiIk3otTAKDw+vcHtkZKTS6zlz5mDOnDk6jIiIiIieZrVujRERERGRvrAwIiIiIpJjYUREREQkx8KIiIiISI6FEREREZEcCyMiIiIiORZGRERERHIsjIiIiIjkWBgRERERybEwIiIiIpJjYUREREQkx8KIiIiISI6FEREREZEcCyMiIiIiORZGRERERHIsjIiIiIjkWBgRERERybEwIiIiIpJjYUREREQkx8KIiIiISI6FEREREZEcCyMiIiIiORZGRERERHIsjIiIiIjkWBgRERERybEwIiIiIpJjYUREREQkx8KIiIiIdOL27dtwdnZGampqjR87NDQUy5Yt03g/FkZERESkE0uXLsXgwYPh6empaJMkSeVn7dq1Go0bExMDX19fODo6ok6dOujQoQO+//57pT4ffPABlixZgpycHI3GNtOoNxEREVEl5OXlITw8HHv37lXZFhERgQEDBiheOzg4aDR2vXr18N5776F169awsLDA7t27MW7cODg7O6N///4AAB8fH3h6emLz5s147bXXKj02zxgRERGR1u3btw9mZmbw8/NT2ebo6AgXFxfFj7W1tUZj9+7dGy+++CK8vb3RrFkzTJ8+HT4+PkhISFDq98ILL2DLli0ajc3CiIiIiLQuISEBvr6+are98cYbqF+/Prp06YK1a9dCJpNV+ThCCBw6dAjJycno2bOn0rb//Oc/OH78OAoKCio9Hi+lERERkdalpqbCzc1Npf3DDz9E3759YW1tjUOHDmHWrFm4desW5s+fr9H42dnZaNSoEQoKCmBqaoqvv/4a/v7+Sn3KtmdmZqJJkyaVGpeFEREREWldfn4+rKysVNofLYA6dOgAAFi8eLHGhZGdnR3OnDmD3NxcHDp0CDNnzkTTpk3Ru3dvRZ+yS3QPHz6s9LgsjIiIiEjrnJyccPfu3Sf269q1K3JycnDjxg00bNiw0uObmJigefPmAEoLrKSkJCxdulSpMLpz5w4AoEGDBpUft9I9iYiIiCqpQ4cOOH/+/BP7nT59GlZWVnB0dKzW8YQQKmuJ/v77b7i7u6N+/fqVHodnjIiIiEjr/P39MX/+fNy9exd169YFAPz000/IzMyEn58frK2tcfjwYbz33nuYNGkSLC0tKz320qVL4evri2bNmqGwsBB79+7Fxo0bsWbNGqV+R44cQUBAgEZxszAiIiIirWvXrh18fX2xbds2TJ48GQBgbm6Or7/+GjNnzoRMJkPTpk2xePFiTJ06VWlfSZIQERGBsWPHqh37wYMHeP3113Ht2jVYW1ujdevW2LRpE4YNG6bok5+fjx07dmD//v0axc3CiIiIiHTi/fffx+zZszFx4kSYmJhgwIABSg92VCc1NRVmZmbo1q1buX0++ugjfPTRRxWOEx4ejmeffRZdu3bVKGYWRkRERKQTgYGBuHjxItLT0+Hh4VGpffbt24dJkyahRYsW1Tq2ubk5vvzyS433Y2FEREREOjN9+nSN+k+ZMkUrx500aVKV9uNdaURERERyLIyIiIiI5FgYEREREcmxMCIiIiKtKJGVICGt9BvuE9ISUCIr0XNEmtNrYbRmzRr4+PjA3t4e9vb28PPzw88//1zhPnFxcejcuTOsrKzQtGlTrF27toaiJSIiovLEJMXAc6UngqKCAABBUUHwXOmJmKQYPUemGb0WRu7u7vj4449x8uRJnDx5Es8//zyCg4Nx7tw5tf1TUlIQGBiIHj164PTp05g3bx6mTZuG6OjoGo6ciIiIysQkxSB0Wyiu5VxTak/PSUfotlCDKo70erv+4MGDlV4vWbIEa9aswbFjx9C2bVuV/mvXrkXjxo2xYsUKAIC3tzdOnjyJzz//HEOHDq2JkImIiOgRJbISTN83HQJCZZuAgAQJb+17C8GtgmFqYqqHCDVTa55jVFJSgh9//BEPHjyAn5+f2j5Hjx5V+c6T/v37Izw8HEVFRTA3N1fZp6CgQOlL5XJycgAARUVFKCoq0mIGUIyn7XFrC2PPDzD+HJmf4TP2HJmf4UlIS8Dt3NuwNrEGAJX/AsCt3FuIT4lH98bdq3ycmnrPJCGEaolXg86ePQs/Pz/k5+fD1tYWUVFRCAwMVNu3ZcuWGDt2LObNm6do+/3339GtWzdcv34drq6uKvssXLgQixYtUmmPioqCjY2N9hIhIiIinXn48CFGjhyJ7Oxs2Nvb6+w4ej9j1KpVK5w5cwb37t1DdHQ0xowZg7i4OLRp00Ztf0mSlF6X1XWPt5eZO3cuZs6cqXidk5MDDw8PBAQEaP2NLSoqwsGDB+Hv76/27JWhM/b8AOPPkfkZPmPPkfkZnoS0BMWCa6D0TNH6Z9Zj/N/jkSfLU7TvGbmnWmeMyq746JreCyMLCws0b94cAODr64sTJ05g5cqVWLdunUpfFxcXZGZmKrVlZWXBzMwMTk5Oase3tLSEpaWlSru5ubnOPpS6HLs2MPb8AOPPkfkZPmPPkfkZjp5ePeFk64T0nHSldUZ5sjzkyfIgQYK7vTt6evWs1hqjmnq/at1zjIQQSmuCHuXn54eDBw8qtR04cAC+vr5G8wEjIiIyJKYmplg5YCUAQILy1Zuy1ysGrDCIhdeAngujefPm4ciRI0hNTcXZs2fx3nvvITY2FmFhYQBKL4ONHj1a0X/KlCm4cuUKZs6ciaSkJKxfvx7h4eGYPXu2vlIgIiJ66oV4h2D7y9vRyL6RUru7vTu2v7wdId4heopMc3q9lHbjxg2MGjUKGRkZcHBwgI+PD/bt2wd/f38AQEZGBtLS0hT9vby8sHfvXsyYMQOrV6+Gm5sbVq1axVv1iYiI9CzEOwTBrYIRnxKPnL9zsGfknmpfPtMHvRZG4eHhFW6PjIxUaevVqxcSExN1FBERERFVlamJKbo37o69f+9F98bdDa4oAmrhGiMiIiIifdH4jNGjt74/SpIkWFlZoXnz5ggODka9evWqHRwRERFRTdK4MDp9+jQSExNRUlKCVq1aQQiBixcvwtTUFK1bt8bXX3+NWbNmISEhodxnERERERHVRhpfSgsODka/fv1w/fp1nDp1ComJiUhPT4e/vz9GjBiB9PR09OzZEzNmzNBFvEREREQ6o3Fh9Nlnn+HDDz9Uemq0vb09Fi5ciE8//RQ2Njb44IMPcOrUKa0GSkRERKRrGhdG2dnZyMrKUmm/efOm4nHdjo6OKCwsrH50RERERDWoSpfSxo8fjx07duDatWtIT0/Hjh07MGHCBAwZMgQAcPz4cbRs2VLbsRIRERHplMaLr9etW4cZM2Zg+PDhKC4uLh3EzAxjxozB8uXLAQCtW7fGd999p91IiYiIiHRM48LI1tYW3377LZYvX47Lly9DCIFmzZrB1tZW0adDhw7ajJGIiIioRlT5yde2trbw8fHRZixEREREeqVxYfTgwQN8/PHHOHToELKysiCTyZS2X758WWvBEREREdUkjQujV199FXFxcRg1ahRcXV0hSZIu4iIiIiKqcRoXRj///DP27NmDbt266SIeIiIiIr3R+Hb9unXr8nvQiIiIyChpXBh9+OGH+OCDD/Dw4UNdxENERESkNxpfSvviiy9w6dIlNGzYEJ6enjA3N1fanpiYqLXgiIiIiGqSxoVR2dOtiYiIiIyNxoXRggULdBEHERERkd5pvMaIiIiIyFhV6oxRvXr1cOHCBdSvXx9169at8NlFd+7c0VpwRERERDWpUoXR8uXLYWdnp/gzH+pIRERExqhShdGYMWMUfx47dqyuYiEiIiLSK43XGJmamiIrK0ul/fbt2zA1NdVKUERERET6oHFhJIRQ215QUAALC4tqB0RERESkL5W+XX/VqlUAAEmS8N1338HW1laxraSkBPHx8WjdurX2IyQiIiKqIZUujJYvXw6g9IzR2rVrlS6bWVhYwNPTE2vXrtV+hEREREQ1pNKFUUpKCgCgT58+iImJQd26dXUWFBEREZE+aPzk68OHD+siDiIiIiK907gwAoBr165h165dSEtLQ2FhodK2ZcuWaSUwIiIiopqmcWF06NAhvPDCC/Dy8kJycjKeeeYZpKamQgiBTp066SJGIiIiohqh8e36c+fOxaxZs/D333/DysoK0dHRuHr1Knr16oWXXnpJFzESERER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I2OaP3V0lWPZFR9dqxWF0Ztvvoldu3YhPj4e7u7uFfZ1cXFBZmamUltWVhbMzMzUPonb0tISlpaWKu3m5uY6+1DqcuzawJjy69kTcHIqXaj76LnTvDxz5OWZQ5IAd3fju/XbWObwaZ0/wIjm0KsnnGydkJ6TrrTOKE+WhzxZHiRIcLd3N7pb941l/iqi7Rxr6v3S611pQgi88cYbiImJwa+//govL68n7uPn54eDBw8qtR04cAC+vr5G/yEj7TM1BVauLP3z4yccy16vWGF8v1SNBefP8JmamGLlgNJJlKA8iWWvVwxYYVRFEdVuei2Mpk6dik2bNiEqKgp2dnbIzMxEZmYm8vL+d/p07ty5GD16tOL1lClTcOXKFcycORNJSUlYv349wsPDMXv2bH2kQEYgJATYvh1o1Ei53d29tD0kRD9xUeVw/gxfiHcItr+8HY3slSfR3d4d21/ejhBvTiLVHL1eSluzZg0AoHfv3krtERERGDt2LAAgIyMDaWlpim1eXl7Yu3cvZsyYgdWrV8PNzQ2rVq3irfpULSEhpbd0x8cDOTmla1KM8fKLseL8Gb4Q7xAEtwpGfEo8cv7OwZ6Re4zu8hkZBr0WRpW5IU7dV5H06tULiYmJOoiInmampqULdPfuLf0vf6kaFs6f4TM1MUX3xt2x9++96N64O4si0gu9XkojIiIiqk1YGBERERHJsTAiIiIikmNhRERERCTHwoiIiIhIjoURERERkRwLIyIiIiI5FkZEREREciyMiIiIiORYGBERERHJsTAiIiIikmNhRERERCTHwoiIiIhIjoURERERkRwLIyIiIiI5FkZEREREciyMiIiIiORYGBERERHJsTAiIiIikmNhRERERCTHwoiIiIhIjoURERERkRwLIyIiIiI5FkZEREREciyMiIiIiORYGBERERHJsTAiIiIikmNhRERERCTHwoiIiIhIjoURERERkRwLIyIiIiI5FkZEREREciyMiIiIiORYGBERERHJsTAiIiIikmNhRERERCTHwoiIiIhIjoURERERkRwLIyIiIiI5FkZEREREciyMiIiIiORYGBERERHJsTAiIiIikmNhRERERCTHwoiIiIhITq+FUXx8PAYPHgw3NzdIkoSdO3dW2D82NhaSJKn8/PPPPzUTMBERERk1M30e/MGDB2jfvj3GjRuHoUOHVnq/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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.title(\"User Movie Preference\", size=15) \n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "\n",
    "# 绘制原始样本点，要求不同的影片喜好类别用不同的颜色标记\n",
    "# 提示: 用scatter散点图绘制，用它的参数c实现不同的类别用不同的颜色标记\n",
    "#TODO\n",
    "plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='blue', label='Action Movies')  # 动作片  \n",
    "plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='green', label='Comedy Movies')  # 喜剧片  \n",
    "plt.legend()  \n",
    "# 绘制新数据点，用红色x标记，大小为8\n",
    "# 提示：用plt.plot()绘制，用它的参数marker实现不同的标记符号\n",
    "#TODO\n",
    "plt.plot(new_user[0, 0], new_user[0, 1], marker='x', color='red', markersize=8, label='New User')  # 新用户  \n",
    "\n",
    "# 新数据最近邻索引为第一个最近邻的索引\n",
    "dist, idx = knn.kneighbors(new_user) #TODO\n",
    "nearest = X[idx[0][0]]#TODO # 获取最近邻点的坐标，这是一个列表，第一个元素是x坐标，第二个元素是y坐标\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "# 提示：用plt.plot()绘制，用 r-- 实现红色虚线\n",
    "#TODO\n",
    "plt.plot([new_user[0, 0], nearest[0]], [new_user[0, 1], nearest[1]], 'r--')  # 红色虚线  \n",
    "\n",
    "# 为每个点添加坐标文本  \n",
    "for x, y in zip(X[:, 0], X[:, 1]):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})') \n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0,0], new_user[0,1]+0.1, f'({new_user[0,0]}, {new_user[0,1]})')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
